package com.me.study.javaCore.jndi;

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * JNDI 学习：使用 RMI 提供 JNDI服务
 * 见：https://www.iteye.com/blog/lance2002-2101960
 * https://blog.csdn.net/liushuai_ly/article/details/8634957
 *
 * @author ME
 * @date   2020/5/14
 */
public class TestJndiRmiSever {
    public static String serverUrl = "rmi://localhost:9999";
    public static String serverName = "java:comp/env/SampleDemo";

    public static void main(String[] args) {
        try {
            // 在本地 创建 RMI注册服务器。
            // 与 JNDI代码不搭嘎，只是后面需要在 RMI服务器注册服务 提前初始化
            LocateRegistry.createRegistry(9999);

            // 初始化服务端对象
            JndiServiceImpl jndiService = new JndiServiceImpl();
            jndiService.setPersonName("Tom");

            // 设置JNDI属性
            Properties properties = new Properties();
            // 设置 JNDI 的环境工厂：RMI（可选 LDAP、DNS、COS、NDS、NIS等命名服务，还可以基于本地文件系统）
            // 名称          服务提供程序工厂
            // 文件系统      com.sun.jndi.fscontext.RefFSContextFactory
            // LDAP         com.sun.jndi.ldap.LdapCtxFactory
            // RMI          com.sun.jndi.rmi.registry.RegistryContextFactory
            // COS          com.sun.jndi.cosnaming.CNCtxFactory
            // DNS          com.sun.jndi.dns.DnsContextFactory
            properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
            // RMI注册服务器地址
            properties.setProperty(Context.PROVIDER_URL, serverUrl);

            InitialContext ctx = new InitialContext(properties);
            ctx.bind(serverName, jndiService);
            System.out.println("服务注册成功：[" + serverName + ", " + jndiService.getClass().getName() + "]");
            ctx.close();
        } catch (RemoteException | NamingException e) {
            e.printStackTrace();
        }
    }
}
